package com.youmu.sichuansfc.util;

import org.apache.log4j.Logger;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


/**
 *  自定义 http请求 做get和post请求
 * @author sunshine
 *
 */
public class HttpRequestUtil {

	private static  Logger logger =  Logger.getLogger(HttpRequestUtil.class);

	public static void main(String[] args)throws Exception {
		
		// sendPost("http://capps.cn/create", "longurl=https://www.doyiter.com/casting/pagev2/h5/profile.html");
	}
	
	/*
	 * Accept 浏览器可接受的MIME类型
	 * Accept-Charset 浏览器支持的字符编码 
	 * Accept-Encoding 浏览器知道如何解码的数据编码类型(如 gzip)。
	 * Servlets 可以预先检查浏览器是否支持gzip并可以对支持gzip的浏览器返回gzipped的HTML页面，并设置Content-Encoding回应头(
	 * response header)来指出发送的内容是已经gzipped的。在大多数情况下，这样做可以加快网页下载的速度。
	 * Accept-Language 浏览器指定的语言，当Server支持多语种时起作用。 
	 * Authorization  认证信息，一般是对服务器发出的WWW-Authenticate头的回应。 
	 * Connection 是否使用持续连接。如果servlet发现这个字段的值是Keep-Alive，或者由发出请求的命令行发现浏览器支持 HTTP 1.1
	 * (持续连接是它的默认选项)，使用持续连接可以使保护很多小文件的页面的下载时间减少。
	 *  Content-Length (使用POST方法提交时，传递数据的字节数)
	 *  Cookie (很重要的一个Header，用来进行和Cookie有关的操作，详细的信息将在后面的教程中介绍) Host (主机和端口)
	 * If-Modified-Since (只返回比指定日期新的文档，如果没有，将会反回304 "Not   Modified") Referer
	 * (URL) User-Agent (客户端的类型，一般用来区分不同的浏览器)
	 */
	/**
	 * 
	 * @param url
	 *                发送请求的 URL
	 * @param param  
	 * 				请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
	 * @param headers
	 * 				自定义头部 {"key":value, "key":value}
	 * @return
	 */
	 public static JSONObject sendPost(String url, JSONObject param, JSONObject headers) throws Exception {
	        PrintWriter out = null;
	        BufferedReader in = null;
	        String result = "";
	        try {
	            URL realUrl = new URL(url);
	            // 打开和URL之间的连接
	            URLConnection conn = realUrl.openConnection();
	          
	            // 设置通用的请求属性
	            conn.setRequestProperty("accept", "*/*");
	            conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");
	            conn.setRequestProperty("connection", "Keep-alive");
	            conn.setRequestProperty("user-agent",
	                    "Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1");
	            // 自定义请求属性
	            if(headers != null) {
	            	Iterator<String> sIterator = headers.keys();
	            	while(sIterator.hasNext()){  
	            	    // 获得key  
	            	    String key = sIterator.next();
	            	    // 根据key获得value, value也可以是JSONObject,JSONArray,使用对应的参数接收即可  
	            	    String value = headers.getString(key);
	            	    //设置自定义头部
	    	            conn.setRequestProperty(key, value);
	            	}
	            }
	            // 发送POST请求必须设置如下两行
	            conn.setDoOutput(true);
	            conn.setDoInput(true);
	            // 获取URLConnection对象对应的输出流
	            out = new PrintWriter(conn.getOutputStream());
	            // 发送请求参数
	            out.print(param);
	            // flush输出流的缓冲
	            out.flush();
	            // 定义BufferedReader输入流来读取URL的响应
	            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	            String line;
	            while ((line = in.readLine()) != null) {
	                result += line;
	            }
	        } catch (Exception e) {
	        	logger.info("发送 POST 请求出现异常！"+e);
	            e.printStackTrace();
	        }//使用finally块来关闭输出流、输入流
	        finally{
	            try{
	                if(out!=null){
	                    out.close();
	                }
	                if(in!=null){
	                    in.close();
	                }
	            }
	            catch(Exception ex){
	                ex.printStackTrace();
	            }
	        }
	        logger.info(result);
	        return new JSONObject(result);
	    }  
	 
	 	/**
	 	 *
	 	 * @param url  发送请求的URL  参数挂url上
	 	 * @param headers	自定义头部 {"key":value, "key":value}
	 	 * @return
	 	 */
	    public static JSONObject sendGet(String url, Map<String, String> headers)  throws Exception {
	        String result = "";
	        BufferedReader in = null;
	        try {
	            String urlNameString = url ;
	            URL realUrl = new URL(urlNameString);
	            // 打开和URL之间的连接
	            URLConnection connection = realUrl.openConnection();
	            // 设置通用的请求属性
	            connection.setRequestProperty("accept", "*/*");
	            connection.setRequestProperty("connection", "Keep-Alive");
	            connection.setRequestProperty("user-agent",
	                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");      
	            // 自定义请求属性
	            if(headers != null) {
					Set set = headers.keySet();
					Iterator iter = set.iterator();
					while (iter.hasNext()) {
						String key =  iter.next().toString();
						String value = headers.get(key);
						connection.setRequestProperty(key, value);

					}
	            }

	            // 建立实际的连接
	            connection.connect();

	            //

	            // 定义 BufferedReader输入流来读取URL的响应
	            in = new BufferedReader(new InputStreamReader(
	                    connection.getInputStream()));
	            String line;
	            while ((line = in.readLine()) != null) {
	                result += line;
	            }
	        } catch (Exception e) {
	            logger.info("发送GET请求出现异常！" + e);
	            e.printStackTrace();
	        }
	        // 使用finally块来关闭输入流
	        finally {
	            try {
	                if (in != null) {
	                    in.close();
	                }
	            } catch (Exception e2) {
	                e2.printStackTrace();
	            }
	        }
	        try {
				return new JSONObject(result);
			}catch (Exception e){
	        	return  null;
			}
	    }
}
